﻿#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>
#include <stdlib.h>
#include <limits.h>


//给定一个整数sum，从有N个有序元素的数组中寻找元素a，b，使得a+b的结果最接近sum
//void findClosestSum(int arr[], int n, int sum, int* a, int* b) {
//    // 初始化左右指针
//    int left = 0;
//    int right = n - 1;
//    // 初始化最接近的和为最大整数值
//    int closestSum = INT_MAX;
//
//    while (left < right) {
//        // 计算当前指针位置对应的两个元素的和
//        int currentSum = arr[left] + arr[right];
//
//        // 更新最接近的和
//        if (abs(currentSum - sum) < abs(closestSum - sum)) {
//            closestSum = currentSum;
//            *a = arr[left];
//            *b = arr[right];
//        }
//
//        // 根据当前和与目标和的关系移动指针
//        if (currentSum < sum) {
//            left++;
//        }
//        else if (currentSum > sum) {
//            right--;
//        }
//        else {
//            // 如果当前和等于目标和，则直接返回
//            return;
//        }
//    }
//}
//
//int main() {
//    int arr[] = { 1, 3, 5, 7, 10 };
//    int n = sizeof(arr) / sizeof(arr[0]);
//    int sum = 8;
//    int a, b;
//
//    findClosestSum(arr, n, sum, &a, &b);
//
//    printf("最接近%d的两个元素为：%d 和 %d\n", sum, a, b);
//
//    return 0;
//}


#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

//void findClosestSum(int arr[], int n, int sum, int* a, int* b, int* c, int* d) {
//    // 初始化最接近的和为最大整数值
//    int closestSum = INT_MAX;
//
//    for (int i = 0; i < n - 3; i++) {
//        for (int j = i + 1; j < n - 2; j++) {
//            // 初始化两个指针left和right，分别指向i和j后面的位置
//            int left = j + 1;
//            int right = n - 1;
//
//            while (left < right) {
//                // 计算当前四个元素的和
//                int currentSum = arr[i] + arr[j] + arr[left] + arr[right];
//
//                // 更新最接近的和
//                if (abs(currentSum - sum) < abs(closestSum - sum)) {
//                    closestSum = currentSum;
//                    *a = arr[i];
//                    *b = arr[j];
//                    *c = arr[left];
//                    *d = arr[right];
//                }
//
//                // 根据当前和与目标和的关系移动指针
//                if (currentSum < sum) {
//                    left++;
//                }
//                else if (currentSum > sum) {
//                    right--;
//                }
//                else {
//                    // 如果当前和等于目标和，则直接返回
//                    return;
//                }
//            }
//        }
//    }
//}


//void findClosestSum(int arr[], int n, int sum, int* a, int* b, int* c, int* d)
//{
//    int ClosestSum = INT_MAX;
//    int i = 0, j = n - 1; // 外层循环变量
//    while (i < j)
//    {
//        int left = i + 1, right = j - 1; // 内层循环变量
//        while (left < right)
//        {
//            int CurrentSum = arr[left] + arr[right] + arr[i] + arr[j];
//
//            if (abs(CurrentSum - sum) < abs(ClosestSum - sum))
//            {
//                ClosestSum = CurrentSum;
//                *a = arr[i];
//                *b = arr[j];
//                *c = arr[left];
//                *d = arr[right];
//            }
//            if (CurrentSum < sum) //内层逼近
//                left++;
//            else if (CurrentSum > sum)
//                right--;
//            else
//                break;
//        }
//        if (ClosestSum < sum) // 外层逼近
//            i++;
//        else if (ClosestSum > sum)
//            j--;
//        else
//            break;
//    }
//
//}
//
//int main() {
//    int arr[] = { 1, 3, 5, 7, 10, 20 };
//    int n = sizeof(arr) / sizeof(arr[0]);
//    int sum = 22;
//    int a, b, c, d;
//
//    findClosestSum(arr, n, sum, &a, &b, &c, &d);
//
//    printf("四个元素和最接近 %d 的四个元素为：%d, %d, %d, %d\n", sum, a, b, c, d);
//
//    return 0;
//}

//int** fun(int n) {
//    int** s = (int**)malloc(n * sizeof(int*));
//    while (n--)
//        s[n] = (int*)malloc(n * sizeof(int));
//    return s;
//}





